import pip
import torch

# !pip install pandas

"""
    创建一个行向量 x,默认为整数
    tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
"""
x = torch.arange(10)
print(x)

print(x.shape)  # torch.Size([10])
print(x.size())  # torch.Size([10]) 元素的总数
print(x.numel())  # x中元素的个数 10
"""
tensor([[1, 1],
        [2, 3],
        [4, 5],
        [6, 7],
        [8, 9]])
"""
X = x.reshape(2, 5)  # 返回一个新排列的tensor，数据指向同一块内存
X[0, 0] = 1
print(X[0, 0])
print(x[0])
"""
tensor([[1, 1, 2, 3, 4],
        [5, 6, 7, 8, 9]])
"""
X1 = x.reshape(5, -1)  # 自动推算列的个数
print(X1)
print(X)
Y = torch.ones(1, 1, 2)  # tensor([[[1., 1.]]])
print(Y)
"""
    tensor([[1, 2],
            [3, 4]])
"""
Z = torch.tensor([[1, 2], [3, 4]])
print(Z)
W = torch.tensor([[1, 2], [3, 4]])
print(Z.cuda() * W.cuda())  # 对应元素相乘，不是点积或叉积
Q = torch.arange(16)
QQ = Q.resize_(4, 4)
"""
    tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
"""
print(QQ)
"""
    取第一个维度的下标为1,2的元素，取第二个维度的下标为2的元素。(不包括右边界)
    tensor([[ 6],
        [10]])
"""
print(QQ[1:3, 2:3])
print(QQ[2, 3])  # tensor(11) 取出第一个维度下标为2且第二个维度下标为3的元素
print(QQ[2, 3].item())  # 张量转为标量 11
print(float(QQ[2, 3]))  # 张量转为标量 11.0

# 不是原地操作，新开辟了内存
print(id(Z))  # 3126724640416
Z = Z + W
print(id(Z))  # 3126724667648
# 避免新开内存
Z[:] = Z + W  # 原地操作，不开辟新内存
print(id(Z))  # 3126724667648
Z += W  # 也是原地操作
print(id(Z))  # 3126724667648
print(len(Z))  # 2
E = torch.arange(2)
"""
    E.dot(E) tensor(1)
"""
print('E.dot(E)', E.dot(E))  # 向量点积
"""
    Z : tensor([[ 4,  8],
        [12, 16]])
    E : tensor([0, 1])
    Z.mv(E) : tensor([ 8, 16])
"""
print('Z :', Z)
print('E :', E)
print('Z.mv(E) :', Z.mv(E))  # 矩阵-向量乘积
"""
    Z.mm(Z) : tensor([[112, 160],
        [240, 352]])
"""
print('Z.mm(Z) :', Z.mm(Z))  # 矩阵-矩阵乘积
